home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / expl / explzako.lzh / expl.c < prev    next >
C/C++ Source or Header  |  1998-11-12  |  6KB  |  274 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <XSP2lib.H>
  5. #include <pcm8afnc.h>
  6. #include <sys/dos.h>
  7. #include <sys/iocs.h>
  8. #include "expl.h"
  9. #include "fxsp2lib.h"
  10.  
  11.  
  12. #define    PCG_MAX    1024        /* スプライトPCGパターン最大使用数 */
  13. #define    REF_MAX    1024        /* 複合スプライトリファレンスデータ最大使用数 */
  14. #define    FRM_MAX    1024        /* 複合スプライトフレームデータ最大使用数 */
  15. #define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
  16.  
  17. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  18. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  19. static XOBJ_FRM_DAT frm_dat[FRM_MAX];    /* フレームデータ */
  20. static XOBJ_REF_DAT ref_dat[REF_MAX];    /* リファレンスデータ */
  21. static int old_crtmod;
  22.  
  23. extern int bomb_init0 (void);
  24. extern void bomb_move (void);
  25. extern void bomb_tini (void);
  26.  
  27. extern int seq_init0 (void);
  28. extern void seq_init (void);
  29. extern void seq_move (void);
  30. extern void seq_tini (void);
  31.  
  32. extern unsigned char seq_counter;
  33. int s_option = 0;
  34.  
  35.  
  36. void usage (void)
  37. {
  38.     printf ("爆発パターン表示&作成 expl.x ver0.01\n"
  39.         "        programmed by Mitsuky <FreeSoftware>\n"
  40.         "[option]\n"
  41.         "    -S数値 : 乱数のシードを指定\n"
  42.     );
  43. }
  44.  
  45. /* 起動時のファイル読み込み */
  46. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  47. int load_file (char *fname, void *ptr, size_t size, size_t n)
  48. {
  49.     FILE *fp;
  50.     int i;
  51.  
  52.     if ((fp = fopen (fname, "rb")) == NULL) {
  53.         //fatal_error (ERROR_FILE, fname);
  54.     }
  55.     i = fread (ptr, size, n, fp);
  56.     fclose (fp);
  57.  
  58.     return (i);        /* 返り値は読み込みバイト数 */
  59. }
  60.  
  61.  
  62. void wait_vdisp (void)
  63. {
  64.     int sp;
  65.     sp = _iocs_b_super (0);
  66.     while ((*(volatile unsigned char *) 0xe88001) & 0x10 == 0);
  67.     while ((*(volatile unsigned char *) 0xe88001) & 0x10);
  68.     _iocs_b_super (sp);
  69. }
  70.  
  71.  
  72.  
  73. void init (void)
  74. {
  75.     int i, sp;
  76.     unsigned short *s, *d;
  77.     unsigned short pal_dat[16 * 15];    /* パレットデータファイル読み込みバッファ */
  78.     int sizeof_ref;        /* 複合スプライトリファレンスデータ読み込み数 */
  79.     unsigned short crtcdata[9] =
  80.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 785};
  81.     unsigned short textpalet[16] =
  82.     {0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  83.  
  84.     old_crtmod = _iocs_crtmod (-1);
  85.     _iocs_b_curoff ();
  86.     wait_vdisp ();
  87.     _iocs_crtmod (14);    /* 256*256dot 31kHz 65536色 */
  88.     _iocs_g_clr_on ();
  89.     _iocs_b_curoff ();
  90.     _iocs_ms_curof ();
  91.     _iocs_skey_mod (0, 0, 0);
  92.  
  93.     //sp = _iocs_b_super (0);
  94.     //*(unsigned short *) 0xe82600 &= 0xff80;    /* 画面表示全オフ */
  95.     //_iocs_b_super (sp);
  96.  
  97.  
  98.     _iocs_sp_init ();
  99.     _iocs_sp_on ();        /* スプライト表示をON */
  100.     _iocs_bgctrlst (0, 0, 0);    /* BG0表示OFF */
  101.     _iocs_bgctrlst (1, 1, 0);    /* BG1表示OFF */
  102.  
  103.  
  104.     /* 256x256 正方形モードを作る */
  105.     sp = _iocs_b_super (0);
  106.     *(unsigned short *) 0xe80028 = crtcdata[8];
  107.     d = (unsigned short *) 0xe80002;
  108.     for (i = 1; i < 8; i++)
  109.         *d++ = crtcdata[i];
  110.     *(unsigned short *) 0xe80000 = crtcdata[0];
  111.  
  112.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  113.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  114.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  115.     *(unsigned short *) 0xeb080e = crtcdata[6];
  116.  
  117.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  118.     _iocs_b_super (sp);
  119.  
  120.     load_file ("BOM.SP", pcg_dat, sizeof (char), 128 * PCG_MAX);
  121. #if    0
  122.     load_file ("obj.xsp", pcg_dat + 256 * 128, sizeof (char), 128 * PCG_MAX);
  123.     load_file ("obj.frm", frm_dat, sizeof (XOBJ_FRM_DAT), FRM_MAX);
  124.     sizeof_ref = load_file ("obj.ref", ref_dat, sizeof (XOBJ_REF_DAT), REF_MAX);
  125. #endif
  126.     load_file ("BOM01.PAL", pal_dat, 2, 16);
  127.  
  128. #if    0
  129.     /* FRM_DAT[].pt 補正 */
  130.     for (i = 0; i < 256; i++)
  131.         (short) frm_dat[i].pt += 256;
  132.  
  133.     /* REF_DAT[].ptr 補正 */
  134.     for (i = 0; i < sizeof_ref; i++)
  135.         (int) ref_dat[i].ptr += (int) (&frm_dat[0]);
  136. #endif
  137.  
  138.     /* パレットに転送 */
  139.     sp = _iocs_b_super (0);
  140.     s = (unsigned short *) 0xe82200;
  141.     for (i = 0; i < 16; i++)
  142.         *s++ = textpalet[i];
  143.     d = pal_dat;
  144.     for (i = 0; i < 15 * 16; i++)
  145.         *s++ = *d++;
  146.     _iocs_b_super (sp);
  147.  
  148.     {
  149.         struct _lineptr lp;
  150.         lp.x1 = 0;
  151.         lp.y1 = 128;
  152.         lp.x2 = 255;
  153.         lp.y2 = 128;
  154.         lp.color = 0xf800;
  155.         lp.linestyle = 0xaaaa;
  156.         _iocs_line (&lp);
  157.         lp.x1 = 128;
  158.         lp.y1 = 0;
  159.         lp.x2 = 128;
  160.         lp.y2 = 255;
  161.         _iocs_line (&lp);
  162.     }
  163.  
  164.     seq_init0 ();
  165.     bomb_init0 ();
  166. #if    0
  167.     enemy_init0 ();
  168. #endif
  169.     _dos_breakck (2);    /* BREAK チェックを殺す */
  170.  
  171.     xsp_on ();
  172.     fxsp_on ();
  173.     xsp_mode (2);
  174.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  175.     xsp_objdat_set (ref_dat);
  176.     pcm8a_vsyncint_on ();
  177.  
  178.     //sp = _iocs_b_super (0);
  179.     //*(unsigned short *) 0xe82600 |= 0x007f;    /* 画面表示オン */
  180.     //_iocs_b_super (sp);
  181. }
  182.  
  183.  
  184. int tini (void)
  185. {
  186.     int sp;
  187.  
  188.     pcm8a_vsyncint_off ();
  189.     xsp_off ();
  190.     fxsp_off ();
  191.  
  192.     bomb_tini ();
  193.     wait_vdisp ();
  194.  
  195.     sp = _iocs_b_super (0);
  196.     *(unsigned short *) 0xe8e006 &= 0xfffd;    /* HRL ビット */
  197.     _iocs_b_super (sp);
  198.  
  199.     _iocs_skey_mod (-1, 0, 0);
  200.     _iocs_b_curon ();
  201.     _iocs_crtmod (old_crtmod);
  202.  
  203.     return (0);
  204. }
  205.  
  206.  
  207.  
  208. void game (void)
  209. {
  210.     seq_init ();
  211.  
  212. //    do {
  213.         for (;;) {
  214.             //xsp_vsync (20);
  215.             seq_move ();
  216.             bomb_move ();
  217.             fxsp_out ();
  218.             if (!xsp_out ())
  219.                 break;
  220.         }
  221.         seq_counter = 0;
  222. //    } while ((_iocs_ms_getdt ()& 0xff00) == 0);
  223. }
  224.  
  225.  
  226.  
  227. int main (int argc, char *argv[])
  228. {
  229.     int i;
  230.     int slash_flag = 0;
  231.     int fname_found_flag = 0;    /* ファイル名が1つでもあったか */
  232.  
  233.     {
  234.         char *temp;
  235.  
  236.         temp = getenv ("SLASH");
  237.         if ((temp != NULL) && (*temp == '/')) {
  238.             slash_flag = 1;
  239.         }
  240.     }
  241.  
  242.     for (i = 1; i < argc; i++) {
  243.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  244.             switch (*(argv[i] + 1)) {
  245.  
  246.             case 's':
  247.             case 'S':
  248.                 sscanf (argv[i] + 2, "%d", &s_option);
  249.                 break;
  250.  
  251.             default:
  252.                 usage ();
  253.                 return (-1);
  254.             }
  255.         } else {
  256.             fname_found_flag = 1;
  257.         }
  258.     }
  259.  
  260.     srand(s_option);
  261. #if    0
  262.     if (fname_found_flag == 0) {
  263.         usage ();
  264.         return (-1);
  265.     }
  266. #endif
  267.     init ();
  268.     game ();
  269.  
  270.     tini ();
  271.  
  272.     return (0);
  273. }
  274.